package com.example.emos.wx.user.aop;

import com.example.emos.wx.core.common.util.R;
import com.example.emos.wx.user.shiro.ThreadLocalToken;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 切面类向客户端返回新令牌
 *
 * @Author YinXi
 * @Versin 1.0.0
 * @Date 2023/8/2
 */
@Aspect
@Component
public class TokenAspect {
    /**
     * 媒介类ThradLocal
     */
    @Autowired
    private ThreadLocalToken threadLocalToken;

    /**
     * 切面点
     * 拦截controller中的所有的Java类中的所有的web方法
     */
    @Pointcut("execution(public * com.example.emos.wx.controller.*.*(..)))")
    public void aspect() {

    }

    /**
     * 定义切面点触发后的环绕事件(方法调用之前可以拦截，调用返回之后也可以拦截）
     *
     * @param point 可以获得方法执行之后拦截的返回值
     * @return 增强后的R对象也就是携带新的令牌
     * @throws Throwable
     */
    @Around("aspect()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        //得到web方法的返回值
        R r = (R) point.proceed();
        //获取ThreadLocal中的token
        String token = threadLocalToken.getToken();
        //如果为null说明没有刷新令牌不为null说明刷新了令牌
        if (token != null) {
            //将新的令牌放置到R对象中携带给客户端
            r.put("token", token);
            //清空ThreadLocal中存储的Token
            threadLocalToken.clear();
        }
        return r;
    }
}
